//
// pipes.h
// libprotea
// Tools Library for the Protea Project / OS pipe functionality
// Copyright (C) 2003, 2004, 2005 eXegeSys, Inc.
// Copyright (C) 2008 Bruce A. James
//
// This program is part of the Protea Project.
//
// The Protea Project is free software; you can redistribute it and/or modify it 
// under the terms of the GNU General Public License as published by the 
// Free Software Foundation, either version 3 of the License, or (at your 
// option) any later version.
//
// The Protea Project is distributed in the hope that it will be useful, but 
// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 
// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 
// for more details.
// 
// You should have received a copy of the GNU General Public License along 
// with this program.  If not, see <http://www.gnu.org/licenses/>.
// 
// Please send correspondence to:
// 
// theproteaproject@gmail.com
//

#ifndef __PROTEA_PIPES_H__
#define __PROTEA_PIPES_H__

#include "transport.h"

#define TOOL_PIPE_READ 0
#define TOOL_PIPE_WRITE 1

/*
	\file pipes.h
	\brief OS independent routines for using pipes
*/
class __EXPORT XCPipeTransport : public XCTransport {
public:
	XCPipeTransport( XCAppInterface* app_owner, XCMsgPort* port_owner = NULL );
	XCPipeTransport( XCAppInterface* app_owner, PORT_HANDLE in, PORT_HANDLE out, XCMsgPort* port_owner = NULL );
	~XCPipeTransport();

	/**
		\brief Creates a pipe connection
		Opens two pipe sets.  One for read, one for writing
		Returns a transport object to be used by the client
	*/
	XCPipeTransport* Create();

	int		Send( const void* data, int size = -1 );
	int		Recv( void* data, int size );
	int		Close();

	// Transport specific stuff
	void SetOutPipe( PORT_HANDLE new_pipe );

	PORT_HANDLE GetInHandle();
	PORT_HANDLE GetOutHandle();
protected:
	/// Read/Write pipe handles
	PORT_HANDLE mPipes[2];
};

#endif
